package com.producer.config;

import com.producer.utility.JsonMessageConverter;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class RabbitTemplateConfig {

    @Bean("rabbitTemplate")
    public RabbitTemplate rabbitTemplate(@Qualifier("connectionFactory") ConnectionFactory connectionFactory) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        //生产端和消费端都需要设置一下，否则无法正常消费
        rabbitTemplate.setMessageConverter(new JsonMessageConverter());

		/*
		  当消息到达Broker时会触发confirmCallback，即消息到达交换机exchange时触发，不能确认消息是否达到队列
		 */
        rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
            System.out.println("这是RabbitTemplate的ConfirmCallback，消息唯一标识 = " + correlationData);
            System.out.println("这是RabbitTemplate的ConfirmCallback，确认结果 = " + ack);
            System.out.println("这是RabbitTemplate的ConfirmCallback，失败原因 = " + cause);
        });

    	/*
    	  当为true时，如果交换机找不到对应的队列时会触发ReturnCallback将消息返回给生产者
    	  当为false时，如果交换机找不到对应的队列时会直接将消息丢弃
    	 */
        rabbitTemplate.setMandatory(true);
    	/*
    	  当消息到达交换机，却找不到对应的队列时触发
    	 */
        rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> {
            System.out.println("这是RabbitTemplate的ReturnCallback，消息主体=" + message);
            System.out.println("这是RabbitTemplate的ReturnCallback，返回码=" + replyCode);
            System.out.println("这是RabbitTemplate的ReturnCallback，返回报文=" + replyText);
            System.out.println("这是RabbitTemplate的ReturnCallback，消息使用的exchange=" + exchange);
            System.out.println("这是RabbitTemplate的ReturnCallback，息使用的路由键=" + routingKey);
        });

        return rabbitTemplate;
    }
}
